// 使用2号引脚作为红外led的驱动引脚
const int IR_LED = 2;
// 载波的发射频率
const int Freq = 38000;
const int CarrierCyclesInOneBaud = 24;

// 调制并发送一个bit
// 发送数据0则发送数据，接收器总线将被拉低
// 发送数据1则不发送数据，接收器总线保持高电平
void IRSendCarrier(unsigned char  dat){
  if(dat){
    for(int i = 0;i < CarrierCyclesInOneBaud;i++)
    { // 发送数据1，接收器不拉低
      digitalWrite(IR_LED, 0);
      delayMicroseconds(13);
      digitalWrite(IR_LED, 0);
      delayMicroseconds(13);
    }
  }
  else
  {
    for(int i = 0;i < CarrierCyclesInOneBaud;i++)
    {
      // 发送数据0，接收器总线拉低
      digitalWrite(IR_LED, 1);
      delayMicroseconds(13);
      digitalWrite(IR_LED, 0);
      delayMicroseconds(13);
    }
  }
}

// 使用红外线发送一个字节
void IRSendByte(unsigned char dat){
  // 8个数据位，无校验位，1个停止位，低字节优先发送
  // 发送一个起始位
  IRSendCarrier(0);
  // 发送数据
  for(int i = 0x01;i&0xff;i<<=1)
  {
    IRSendCarrier(i & dat);
  }
  //发送停止位
  IRSendCarrier(0);

  delay(40);
}

void setup() {
  pinMode(IR_LED, OUTPUT);
  Serial.begin(115200);
}

void loop() {
  // 无消息则等待
  while(!Serial.available());
  unsigned char  recv = Serial.read();
  // 发送红外信号
  IRSendByte(recv);
  // 发送到pc端
  Serial.write(recv);
}
